package 岛屿问题;

import java.util.Scanner;

/**
 * @author: AirMan
 * @date: 2025/5/29 10:43
 * @description:
 * 题目描述
 *
 * 给定一个由 1（陆地）和 0（水）组成的矩阵，计算岛屿的最大面积。岛屿面积的计算方式为组成岛屿的陆地的总数。岛屿由水平方向或垂直方向上相邻的陆地连接而成，并且四周都是水域。你可以假设矩阵外均被水包围。
 *
 * 输入描述
 *
 * 第一行包含两个整数 N, M，表示矩阵的行数和列数。后续 N 行，每行包含 M 个数字，数字为 1 或者 0，表示岛屿的单元格。
 *
 * 输出描述
 *
 * 输出一个整数，表示岛屿的最大面积。如果不存在岛屿，则输出 0。
 *
 * 输入示例
 */
public class Solution4 {

    static final int[][] dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
    static int result = 0;
    static int count = 0;

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int[][] map = new int[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                map[i][j] = scanner.nextInt();
            }
        }
        boolean[][] visited = new boolean[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (!visited[i][j] && map[i][j] == 1) {
                    count = 0;
                    dfs(map, visited, i, j);
                    result = Math.max(count, result);
                }
            }
        }
        System.out.println(result);
    }

    static void dfs(int[][] map, boolean[][] visited, int x, int y) {
        count++;
        visited[x][y] = true;
        for (int i = 0; i < 4; i++) {
            int nextX = x + dir[i][0];
            int nextY = y + dir[i][1];
            //水或者已经访问过的跳过
            if (nextX < 0 || nextY < 0
                    || nextX >= map.length || nextY >= map[0].length
                    || visited[nextX][nextY] || map[nextX][nextY] == 0) continue;

            dfs(map, visited, nextX, nextY);
        }
    }

}
